#pragma once
#include <iostream>
using namespace std;
#include <functional>

enum class FdEvent { // 文件描述符的就绪事件
	_TimeOut = 0x01,
	_ReadEvent = 0x02,
	_WriteEvent = 0x04
};

class Channel { 
public:
	using handleFunc = function<int(void*)>; // 回调函数的函数指针
	// 实例化
	Channel(int fd, FdEvent events, handleFunc readFunc, handleFunc writeFunc, handleFunc destroyFunc, void* arg);

	void writeEventEnable(bool flag); // 设置是否检测_fd的写事件

	bool isWriteEventEnable() const; // 判断是否检测_fd的的写事件
	bool isReadEventEnable() const;  // 判断是否检测_fd的的读事件

	void setCurrentEvent(FdEvent events); // 对当前要检测的数据进行检测

	// 取出私有成员的值ֵ
	const int getFd() const { return _fd; }
	const int getEvents() const { return _events; }
	const void* getArg() const { return _arg; }

	// fd的监视事件就绪后，分别调用的回调函数
	handleFunc _readCallback;    // 读回调
	handleFunc _writeCallback;   // 写回调
	handleFunc _destroyCallback; // 销毁回调
private:
	int _fd;	 // 文件描述符
	int _events; // 需要监视的事件
	void* _arg;	 // 对于主线程的监听Fd对应的Channel: _arg为所属T的TcpServer
				 // 对于工作线程的服务Fd对应的Channel: _arg为所属的TcpConnection
};